23

» WarCraft 3 / Карта не отображается в самом варкрафте

Похожие вопросы:

ответ
скорее всего это что-то из разряда исикаповских клиентов
ответ
Smart096, баг только в этой карте?
в новых картах бага нету?
если да то стоит проверить импортируемые модели и текстуры (мб часть битая)
но с вероятностью в 60% проблема в системе ибо было много жалоб на баги в вин10
ответ
У твоей модели, которая добавляется, вероятно есть нестандартные текстуры. Нужно правильно расположить модель относительно ее текстур. Насколько я помню, я их располагал в одну папку и, вроде как, работало.
ответ
Надо открыть в ladik's mpq editor и удалить папку locales

23

» WarCraft 3 / Баг WURST

Похожие вопросы:

ответ
По коду честно говоря ничего не понятно. Но в отлове урона это обычная ошибка, когда урон наносится внутри триггера, отлавливающего урон или если он вызывает действия которые наносят урон и снова вызывают этот триггер. Бесконечная рекурсия в общем роняет игру.

23

» WarCraft 3 / Респавн крипов

Похожие вопросы:

ответ
Вот обновленная версия на структурах, я её вроде выкладывал...
либо используйте CreateCreepOfType для создания крипов, так будет респаунить тока тех крипов которых вы создали этой функцией...
ответ
есть куча статей и наработок
юзайте поиск

pro100master, не самый лучший вариант
куча таймеров может вызвать тормоза
лучше использовать 1 периодический таймер и им просто перебирать список умерших юнитов
ответ
Не проще ли глянуть как оно в самой доке? ;) xgm.guru/forum/showthread.php?t=4311
ответ
Мк.Задрот, я давно задавал вопрос, ответ найдёшь там

23

» WarCraft 3 / Спавн юнитов при входе в область

Похожие вопросы:

ответ
пардон,только заметил)
ответ
N7 Molot:
делаешь области примерно x1 на y1 (точка) у каждой декорации, когда приходишь фиксируешь эти точки через set = (центр точки декорации), после функция, которая добавляет БЕ (боевая единица), без русификатора функция "create" и по одной БЕ на каждую точку с ориентировкой на того кто входит в область (так же фиксируй позицию БЕ, которая входит в область), и после всего этого удаляй точки, которые зафиксированы на декор и на БЕ, которая вошла в область.

можно добавит ещё эффект появления на каждой точке у декора, будет красиво)

23

» WarCraft 3 / Триггерное превращение?

Похожие вопросы:

ответ
дак можно же выключить нужный триггер на время замены, и сразу после неё включать
ответ
Alexey103, руки распримите и сделайте триггерную смену анимации, "stand" - при завершении морфа, чтобы небыло death. Для моделей с альтернативными формами, меняются тег анимации, про это есть статьи. Если не получается - смотрите что вы сделали нетак.
ответ
так вроде там морф (спец абилка). после естественной смерти юнит морфится (событие смерти никак не отслеживается). И это легко отслеживается через "приводит в действие".
используй всегда дебаги, выводи на экран. я тоже не всегда знаю, проверяю
подробные абилки
Феникс 'AHpx' - вызывает феникса (можно указать кол-во вызванных). Появляется рядом с кастером. Может вызвать безграничное число птиц. Но есть один нюанс со фениксом - у него есть способность 'Превращение в феникса' Aphx, которое после гибели превращает яйцо. Эта способность не позволяет призывать больше одной жар-птицы. Нельзя отследить кастера - того кто призвал эту птицу (debug показывает что феникс призывает феникса, то есть он сам себя призвал)
Превращение в феникса 'Aphx' - морф работает при смерти. У фенникса каждый раз становится хп меньше (так специально сделали в РО: у феникса отрицательный реген), и когда умрет естественной смертью (не от руки врагов), тогда превращается в яйцо (такой цикл). Яйцо просуществует несколько секунд (можно задать длительность морфа, если задать 0.00 - постоянный морф). После из яйца рождается феникс.
ответ
Смени типа движения возможна только через морф в другую боевую единицу через руну (на любом патче)

23

» WarCraft 3 / Функция ForGroup

Похожие вопросы:

ответ
нельзя, используй глобальные переменные для передачи аргументов
ответ
как сказал док юзай обычную функцию без параметров и не бойся
либо если паранойя то перебирай группу циклом
ответ
дочерние потоки наследуют свойства основных
то же касается и екзекута
ответ
Проблема решена, причина была в моей криворукости.
ответ
Можешь спокойно передавать параметры через глобалки, в варе все выполняется строго синхронно.

23

» WarCraft 3 / Редактирование иконок

Похожие вопросы:

ответ
8gabriel8, влзможно ты равкод оставлял у способности разный на разных уровнях.
ответ
можно
начиная с кучи депротекторов и заканчивая mpq архиваторами и hex редактором
спелы и ии написаны на jass
про него можно прочитать тут
ответ
UnitRemoveAbility(whichUnit, 'ARal')
где whichUnit - твое здание
ответ
Удержание, патруль и движение - одна и та же способность.
ответ
Убрать классификацию работник, на что это ещё повлияет - хз

23

» WarCraft 3 / Кампании

Похожие вопросы:

ответ
Как минимум можно переносить данные с карты.Но таким образом ты заменишь то,что у тебя в карте.Другим способом по чуть чуть переносишь и ставишь всё как надо (требования всякие).Таким образом тебе как минимум не нужно будет делать описания и хар-ки.Ну или можешь сам их редактировать.В общем,такие дела.
ответ
Создаёшь в редакторе ИИ порядок действий, сохраняешь, импортируешь и запускаешь используя триггеры ( действия ИИ) для конкретного игрока (например: синий). Могу если нужно скинуть карту пример.

23

» WarCraft 3 / Функции МемХака

Принятый ответ
Похожие вопросы:

ответ
DracoL1ch, Не понял как я поменяю количество еды приносяший?
DracoL1ch, или абилка такой есть?
DracoL1ch, или ты имел виду создать типо так но на основе юнита (Сам писал)
set amount = R2I(amount) - R2I(this[u])
            
            if amount < 0 then
                set amount = -amount
                set rawcode = rawcode + this.count
            endif
            
            set abilityId = this.count - 1
            set abilityLevel = 4
            set currentAbility = rawcode + abilityId
            loop
                exitwhen amount == 0
                
                if amount >= powersOf2[abilityId * 3 + (abilityLevel - 2)] then
                    call UnitAddAbility(u, currentAbility)
                    call SetUnitAbilityLevel(u, currentAbility, abilityLevel)
                    call UnitRemoveAbility(u, currentAbility)
                    
                    set amount = amount - powersOf2[abilityId * 3 + (abilityLevel - 2)]
                else
                    set abilityLevel = abilityLevel - 1
                    if abilityLevel <= 1 then
                        set abilityId = abilityId - 1
                        set abilityLevel = 4
                        set currentAbility = rawcode + abilityId
                    endif
                endif
            endloop
Сделал если кому нужно контроль максимальной еды
// RUS: Создаем 8 юнит еду (Каждый шаг увиличивает 2ух-кратный)
//! runtextmacro UnitStart()
//! i CreateUnit("hfoo", "zxF", "ufma", "8", "FOOD", "BTNMonsterLure.blp")
//! runtextmacro UnitEnd()

//! textmacro UnitStart
    /* RUS: Тут можно убрать если не стоит (MemoryHack)
    //! externalblock extension=lua ObjectMerger $FILENAME$
    //! i function CreateUnit(base, prefix, field, count, name, icon)
    //! i     k = 0
    //! i     j = 0
    //! i     for i = 0, (count - 1) do
    //! i         j = j + 1
    //! i         createobject(base, prefix .. string.sub(chars, k + 1, k + 1))
    //! i         makechange(current, "unam", "Unit - " .. name)
    //! i         makechange(current, "utip", "")
    //! i         makechange(current, "utub", "")
    //! i         makechange(current, "unsf", "(+" .. tostring(2^i) .. ")")
    //! i         makechange(current, "uico", "ReplaceableTextures\\CommandButtons\\" .. icon)
    //! i         makechange(current, field, 2^i)
    //! i         k = k + 1
    //! i     end
    //! i end
    //! i setobjecttype("units")
    //! i chars = "abcdefghijklmnopqrstuvwxyz"
    */
//! endtextmacro

//! textmacro UnitEnd
    /* RUS: Тут можно убрать если не стоит (MemoryHack)
    //! endexternalblock
    */
//! endtextmacro

globals
    constant integer xe_MAX_PLAYERS        = 7
    
    // RUS: Контроль еды
    constant integer xe_COUNT_FOOD         = 8
    constant integer xe_RAWCODE_FOOD       = 'zxFa'
endglobals

struct Food
    private static group   array groups[xe_MAX_PLAYERS]
    private static integer array powers[xe_COUNT_FOOD]
    
    private static method onInit takes nothing returns nothing
        local integer i = 1
        
        set thistype.powers[0] = 1
        
        loop
            exitwhen i > xe_COUNT_FOOD
            set thistype.powers[i] = thistype.powers[i - 1] * 2
            set i = i + 1
        endloop
        
        set i = 0
        loop
            exitwhen i == xe_MAX_PLAYERS
            set thistype.groups[i] = CreateGroup()
            set i = i + 1
        endloop
    endmethod
    
    public static method operator []= takes player p, integer i returns nothing
        local integer count = xe_COUNT_FOOD - 1
        local group g = thistype.groups[GetPlayerId(p)]
        local unit u = FirstOfGroup(g)
        
        loop
            exitwhen u == null
            call RemoveUnit(u)
            call GroupRemoveUnit(g, u)
            set u = FirstOfGroup(g)
        endloop
        
        loop
            exitwhen i == 0
            if i >= thistype.powers[count] then
                call GroupAddUnit(g, CreateUnit(p, xe_RAWCODE_FOOD + count, 0., 0., 0.))
                set i = i - thistype.powers[count]
            else
                set count = count - 1
            endif
        endloop
        
        set u = null
        set g = null
    endmethod
endstruct
ответ
Вот попробуй.
ответ
в 1.26 так делал xgm.guru/p/wc3/163817
Ща mix убраны и архитектура wc переделана, но идея таже - внедриться в процесс варкрафта и найти оффсеты функций.
ответ
Да там перерисовка интерфейса, в новых версиях везде стоит где нужно.

23

» WarCraft 3 / Добавление зеленого урона.

Похожие вопросы:

ответ
Старая "работа" на GUI. Не знаю как она влияет на производительность, но помнится работало. Не советую использовать.
ответ
Насколько я знаю в мемхаке функции достаточно понятным образом называются. Но тем не менее, вот список того что вам может понадобиться. Мне кажется этого хватит для описываемых вами целей.
GetUnitBaseDamage
SetUnitBaseDamage
AddUnitBaseDamage
GetUnitBonusDamage
SetUnitBonusDamage
AddUnitBonusDamage
GetUnitTotalDamage
Я сам не проверял, но они должны выполнять указанную функцию.
А по поводу сохранения - вам понадобится правильная версия pjass, её можно найти в этой статье: xgm.guru/p/wc3/memory-hack, да и вообще в ней все написано про то как запустить мемхак.
И в целом, с мемхаком не нужно слишком сложно думать - нужно просто его поставить, найти нужную функцию и использовать. Благо функции как я уже говорил названы понятным образом.

23

» WarCraft 3 / Способность прыжок

Похожие вопросы:

ответ
На сайте, вот тут, есть хорошая статья об этом. Там не совсем то, что вам нужно, но на базе данного примера вы сможете создать всё самостоятельно.
+
И, между прочим, старый форум ещё никто не отменял.
Барахолка:
Старая академия:
ответ
AllChosen, ты пока что не понимаешь, что делаешь.
ты должен вместо цикла с вэйтом использовать "периодичный" таймер и сдвигать координаты, но пока что советуют посмотреть примеры xgm.guru/p/wc3/spellmaker-stomp-spell-creation
есть таймер одноразовый и периодичный, это все один и то же таймер, просто запускает разные режимы. через TimerStart. Вы таймер уже создали так смотрю, теперь нужно ловить запуски таймеров

23

» WarCraft 3 / Вычисление урона героя

Похожие вопросы:

ответ
урон в секунду = урон за удар/время затраченное на удар(период атаки + время анимации)
в f.a.q. есть формула вычисления урона после снижения бронёй

23

» WarCraft 3 / Триггерная волна силы

Похожие вопросы:

ответ
Наименее ресурсозатратным для игрового процесса будет кастовать саму волну через отдельного дамми, который создаётся специально и только для волны силы. Сама волна наносит 1 ед урона. И потом определив, тип юнит-источника урона - наносим нужный урон от лица героя-хозяина юнита "волна силы".
В варианте "чекать группы каждые 0.0х сек" будет засоряться память и скорее всего будут подлагивания, в варианте со спец-дамиками засорится РО, выбирай из двух зол.
ответ
keks_090, чтобы кастовал бот - нужно триггерно приказать ему это сделать. Например, если тот же топот, то действие: Боевая единица - Приказ без цели (Issue Order With No Target), и выбираешь приказ: Вождь минотавров (Орда) - Громовая поступь. Аналогично с другими типами целей и спеллов. Нужно только выбрать приказ способности, на основе которой была создана триггерная способность.
ответ
Сделана как триггерная темная стая (гуи). Но с таким же успехом можно переделать под волну силы, огненное дыхание, девятый вал, ледяное дыхание. Все эти абилки похожие только спецэффекты разные.

23

» WarCraft 3 / Эффект выстрела остаётся

Похожие вопросы:

ответ
скрином))
ответ
Проверяешь если слот не занят, потом удаляешь жителя.
ответ
Есть триггерные действия на смену текстуры в точке, но там тоже есть предел на их количество.
Где-то здесь на хгме был генератор рандомного ландшафта на триггерах, и там случайно выпадает зимний/осенний ланд и т.д.
ответ
Модель не для варкрафта, ваш кэп

23

» WarCraft 3 / Как можно заменить тайл?

Похожие вопросы:

ответ
Посмотри как сделано в карте. Там же ты можешь скачать альфатайл и останется всунуть только модельку скайбокса место неба. xgm.guru/p/wc3/gad

23

» WarCraft 3 / Почему. Просто почему.

Похожие вопросы:

ответ
Да ну нафиг,или я не правилно говорю или меня не правильно понимают
Думаю, два в одном.
ответ
Когда загружаешь модель, нужно перезагрузить World editor. Если и так не отображаются, может, ты указал неправильный путь к файлам в импорте(смотри видео)
ответ
function PolarProjectionX takes real x, real dist, real angle returns real
    return x + dist * Cos(angle * bj_DEGTORAD)
endfunction

function PolarProjectionY takes real y, real dist, real angle returns real
    return y + dist * Sin(angle * bj_DEGTORAD)
endfunction

function Trig_Hit_Actions takes nothing returns nothing
    local unit caster = GetTriggerUnit()
    local real face = GetUnitFacing(caster)
    local real x = PolarProjectionX(GetUnitX(caster), 100., face)
    local real y = PolarProjectionY(GetUnitY(caster), 100., face)
    local group targets = CreateGroup()
    local unit target
    call GroupEnumUnitsInRange(targets, x, y, 100., null)
    set target = FindClosestToXY(targets, x, y)
    if target != null then
        call UnitDamageTargetBJ(caster, target, 100., ATTACK_TYPE_CHAOS, DAMAGE_TYPE_UNIVERSAL)
        set target = null
    endif
    set caster = null
    call DestroyGroup(targets)
    set targets = null
endfunction
DopaMine, у тебя нет вызова FindClosestUnitXY.
ответ
Bergi_Bear:
Qulore, это помогло решить проблему?
Не. Короче это мистика.
ответ
1 лвл абилки (100 ед. вижна).
Это у абилки. А в характеристиках строения что стоит?

Я тут потестил, у способности на вижн не работают уровни, нужно 10 способностей.

Вот карта, тут бы всё работало, если бы уровни работали.

Обновил карту, добавил понятный индикатор обзора.

23

» WarCraft 3 / Вопрос по редактору карт

Похожие вопросы:

ответ
The Dude, это несерьезно. Все вопросы описаны в большом количестве статей здесь, на нашем сайте - xgm.guru/p/wc3/articles. То, что перечисляешь не верх мастерства WE, а базовые знания. Материалов предостаточно. Успехов в обучении.
ответ
ZeroCaty:
Окей. Я понял, у тебя всё по дефолту. Я имел в виду параметры, которые влияют на то, где, как и когда ИИ строит здание. Немного наврал, там не тип использования, там тип расположения.
ответ
LainMikoroso, Сценарий - > Параметры Карты -> Нестандартное освещение (Ставим галочку) -> Выбираем подходящее
совет: учите инструментарий, без этого никуда
ответ
Всё всем спасибо я разобрался , это было куда элементарнее чем я думал и даже триггеры не надо
ответ
haipyer, говорил же, перенеси просто все кнопки в инициализацию.. это буквально 10 секунд

23

» WarCraft 3 / После применения способности? ИИ застывает.

Похожие вопросы:

ответ
вроде как кулдаун не запускается, если в момент применения способности юнита переместить триггером в какое-нибудь другое место (например, на несколько точек вправо)
ответ
Я решил это через отслеживание начала заклинания, после чего ставил юнита на паузу на 20 сек с проигрыванием анимации. т.е. способность не завершалась, но выгляедло это так, как будто она завершилась
ответ
Никак, это пассивка, да и зачем тебе это нужно? Если можно следить за кол-вом ресурсов?
ответ
8gabriel8, с манакостом, именно с манакостом.

23

» WarCraft 3 / Вопрос про UnitDamageTarget?

Похожие вопросы:

ответ
void - это nothing то есть ничего не возвращает функция, а саму функции называют doTheThing, а unit u - аргументы функции, мануалы про cjass почитай (хотя я тоже соглашусь, что написано очень плохо в мануалах. Нужно попробовать немного самим пописать коды)
можно представить как (если хорошо понимаешь jass)
function doTheThing takes unit u returns nothing
... //что-то делаешь с юнитом u (берем аргумент функции - unit u)
endfunction
GetMyUnit - такой не существует, видимо Док имеет в виду подставить свою переменную
пример
например составил пример функции - определить уровень абилы юнита. Функция называется LV, u - юнит, id - целое число, равкод абилы. Возвращает целое число (уровень абилы).
function LV takes unit u, integer id returns integer
return GetUnitAbilityLevel(u, id)
endfunction 
'A000' - равкод абилы
local integer lv = LV(GetTriggerUnit(), 'A000') //узнаем уровень героя
и честно не понял вопрос темы?

23

» WarCraft 3 / Ошибка в коде ИИ

Похожие вопросы:

ответ
проверь настройки A01P, возможно, там кривые данные выше 3-го уровня
ответ
Ярг Восьмой:
private function Trigger_Conditions takes nothing returns boolean
     return LoadStr(HASHTABLE, GetSpellAbilityId(), StringHash("abil_id")) != null and LoadStr(HASHTABLE, GetSpellAbilityId(), StringHash("abil_id")) != ""
endfunction
попробуйте так, или уберите:
local boolexpr b = Condition(function Trigger_Conditions)
call DestroyBoolExpr(b)
set b = null
Замените call TriggerAddCondition(TRIGGER, b) на call TriggerAddCondition(TRIGGER, Condition(function Trigger_Conditions))

Добавлю
Ещё бывает что значение из хеш-таблицы строкового показывало "(null)";
ответ
Я вообще ничего не смыслю в Jass'e
Статей на сайте предостаточно.
А на крайний случай можно же сконвертировать пустой триггер в код и посмотреть синтаксис вызова.
function Trig_temp_Actions takes nothing returns nothing
endfunction

//===========================================================================
function InitTrig_temp takes nothing returns nothing
    set gg_trg_temp = CreateTrigger(  )
    call TriggerAddAction( gg_trg_temp, function Trig_temp_Actions )
endfunction
ответ
Fly123, эх ладно. вы все не правильно делаете.
  1. вы мне скинули абсолютно пустую карту с отключенным триггером. А где код? Она у меня норм без проблем запустилась.
  2. вам для работы с lua лучше отказаться от гуи. Вы лишаетесь большого инструмента.
  3. Пример Назарова смотрите с движением снарядов ссылка. там показывают. Ну он же есть. Берете пример prog с хуком, и вставляете триггеры
  4. неправильное событие у вас стоит, тк координаты мыши не получить
это какой то простой код, видимо вы пытаетесь понять как запустить. два показательных примера покажу:
первый - вставляете код
do -- создаём область видимости, чтоб не конфликтовать с другим кодом

    local InitGlobalsOrigin = InitGlobals -- хукаем функцию InitGlobals
	function InitGlobals()
		InitGlobalsOrigin()
            -- в этом моменте прошла инициализация карты и можно смело работать
                FogEnableOff()
                FogMaskEnableOff()
                --создаем триггеры
                local MouseMove = CreateTrigger(  )
                TriggerRegisterPlayerMouseEventBJ( MouseMove, Player(0), bj_MOUSEEVENTTYPE_MOVE )
                TriggerAddAction( MouseMove, function()
                    --CreateUnitByName(GetLocalPlayer(),'footman',BlzGetTriggerPlayerMouseX(),BlzGetTriggerPlayerMouseY())
                    print("координаты: "..BlzGetTriggerPlayerMouseX()..","..BlzGetTriggerPlayerMouseY())
                    CreateUnit(Player(0),FourCC('hfoo'),BlzGetTriggerPlayerMouseX(),BlzGetTriggerPlayerMouseY(),0)
                    
                end)
            
        --end
	end
end
второй - с использованием гуи
    function onMouseClick()
        --CreateUnitByName(GetLocalPlayer(),'footman',BlzGetTriggerPlayerMouseX(),BlzGetTriggerPlayerMouseY())
        print("координаты: "..BlzGetTriggerPlayerMouseX()..","..BlzGetTriggerPlayerMouseY())
        CreateUnit(Player(0),FourCC('hfoo'),BlzGetTriggerPlayerMouseX(),BlzGetTriggerPlayerMouseY(),0)
                    
    end
карта пример прилагается. дело не программе, а в кривых руках)

23

» WarCraft 3 / Заставить ИИ применить способность

Принятый ответ
Похожие вопросы:

ответ
Стандартный ИИ никак, только если вы замените канал какими-то другим скиллом, который юзает ИИ в схожей ситуации ( если нужно чтобы ии юзал спелл в толпе то подойдет вызов волка или стомп в качестве пустышки). Ну или совсем радикальный вариант, писать свой ИИ.
ответ
Sergarr, все, понял, спасибо. Хотя эти параметры и установлены по умолчанию в 1, но помогает отключение и включение заново - тогда начинает работать.
Steal nerves, спасибо за разъяснения.
ответ
Как верно всё импортировать
Открываешь свою карту, открываешь мою. Переходишь в редактор юнитов, выбираешь там Dummy, жмёшь Ctrl + C (копировать). Далее вверху "Окна" -> твоя карта. Как только она откроется, жми Ctrl + V (вставить). Появится окошко с выбором равкода, ничего не меняй, жми Ок.

Переходишь в мою карту с помощью меню "Окна". Как только она откроется, перейди в редактор способностей. Также, как ты делал выше, скопируй Bomb Attached, Explode, Put Bomb, War Stomp Dummy.
После этого перейди в свою карту, дай своему юниту, который будет кастовать твою способность, способности Explode и Put Bomb как геройские.

Теперь перейди в мою карту, скопируй все триггеры из категории Bomb, триггер BomberEntersMap копируй самым последним.
В триггере BomberEntersMap, 2 раза кликни по условию и замени выделенное поле на картинке на тип своего юнита. Больше ничего там не трогай!
Далее открываешь переменные в своей карте. Открываешь BomberAbilBombAttached, заменяешь начальное значение на скопированную из моей карты способность Bomb Attached. Аналогично поступаешь с переменными BomberAbilExplode, BomberAbilPutBomb и BomberDummyAbil.

Если всё верно сделаешь, должно работать.
Всё дополнительная информация в комментариях в триггерах.
Всё это будет работать только для 1 героя со способностью Put Bomb на карте.

Если что-то сломается или будут вопросы, то пиши в ЛС, а тут отметь этот комментарий как ответ на вопрос.
ответ
Если это не работает, то ищешь в ро у своей абилки строку
И пишешь следующий кастом скрипт
call IssueTargetOrder(udg_unit[0],"thunderbolt",udg_unit[1])

upd: ссылка на юнита любая, я выбрал применяющего и юнита-цели, чтобы не писать комментарии

Если ты пользуешься JNGP редактором, то там есть такая кастом функция
ответ
Вставь этот русификатор, он и в джнгп работает норм

23

» WarCraft 3 / Хеш-таблица на ГУИ.

Похожие вопросы:

ответ
Вот примерчик на Хайве
Так же Clamp~ писал что то похожее.
ответ
действительно, почему же не работает?
Это вообще никак не влияет. Ты ещё скажи, что set a = a + 1 не работает.

Дело может быть в том, что юнит за 10 секунд разлагается.
немного исправленный код
function Reborn takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer s = GetHandleId(t)
    local unit dead = LoadUnitHandle (udg_hash, s, 6)
    call FlushChildHashtable(udg_hash, s)
    call CreateUnit(GetOwningPlayer(dead), GetUnitTypeId(dead), GetUnitX(dead), GetUnitY(dead), GetUnitFacing(dead))
    call DestroyTimer(t)
    set dead = null
    set t = null
endfunction

function Trig_Kill_Unit_Actions takes nothing returns nothing
    local unit dead = GetTriggerUnit()                      //Присваиваем убитого юнита
    local timer t = CreateTimer()                              //Создаём таймер
    local integer s = GetHandleId(t)                         //Узнаём его ID
    call SaveUnitHandle(udg_hash, s, 6, dead)       //Сохраняем юнита 
    call TimerStart(t, 10, false, function Reborn)        //Активируем одноразовый таймер на 10 секунд
    set dead = null
    set t = null
endfunction
код с учётом разложения
function Reborn takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer s = GetHandleId(t)
    local player p = LoadPlayerHandle(udg_hash, s, 0)
    local integer id = LoadInteger(udg_hash, s, 0)
    local real x = LoadReal(udg_hash, s, 0)
    local real y = LoadReal(udg_hash, s, 1)
    local real f = LoadReal(udg_hash, s, 2)
    call CreateUnit(p, id, x, y, f)
    call FlushChildHashtable(udg_hash, s)
    call DestroyTimer(t)
    set t = null
    set p = null
endfunction

function Trig_Kill_Unit_Actions takes nothing returns nothing
    local unit dead = GetTriggerUnit()
    local timer t = CreateTimer()
    local integer s = GetHandleId(t)
    call SavePlayerHandle(udg_hash, s, 0, GetOwningPlayer(dead))
    call SaveInteger(udg_hash, s, 0, GetUnitTypeId(dead))
    call SaveReal(udg_hash, s, 0, GetUnitX(dead))
    call SaveReal(udg_hash, s, 1, GetUnitY(dead))
    call SaveReal(udg_hash, s, 2, GetUnitFacing(dead))
    call TimerStart(t, 10, false, function Reborn)
    set dead = null
    set t = null
endfunction

23

» WarCraft 3 / деформация земли

Похожие вопросы:

ответ
и в коде куча утечек
PhysCraft, да это вобще пример того как не надо кодить
EnergyFrost, норм
EnergyFrost, так же замени глобалки локалками
set bj_lastCreatedUnit = CreateUnit(GetOwningPlayer(s.a),dammyBallCasterId,GetUnitX(F),GetUnitY(F),GetUnitFacing(F))
за такое положен расстрел
EnergyFrost, проще написать новый чем этот править
ответ
Всё зависит от мелочей... если ты хочешь запаузить всех кто в данный момент находится на карте - это одно, если вообще ВСЕХ и ВСЁ - это другое...
Стомп застанит только тех, по кому попадёт... те кто появятся после - не будут застанены
Молотбурь застанит только тех, кого укажешь... кого не укажешь - не будут застанены
Пауза работать будет так же как молот, но так паузить баффы и прочее...
Можно собрать стан, который будет станить на 0.00 сек (вечно), а далее его снимать вручную... но тут надо учесть то что все станы должны будут это учитывать (или быть такими же - время таймерное).
. . .
По факту, когда я планировал перевести баффы на триггерную основу (тайминг), пришёл к выводу что мои баффы "обездвиживание" (сетка), "безмолвие" (сало), "обезоруживание" (дизарм - склад) и дополнительный бафф на "сковывание" (скорость поворота на 0), давали в сумме следующее:
  • нельзя двигаться и поворачиваться
  • нельзя кастовать
  • нельзя атаковать
В итоге это практически тот же стан... но с набором баффов в статусе (сетка и сало минимум)
ответ
создаешь объект, спрашиваешь, какой у него handle
если меньше 0x100000 - беспокоиться не о чем, он локальный и сам разрушится, если не помешаешь ссылками на него (да и то не факт, что это влияет для них). тем паче, что даже в нативке указывается, вечная или нет деформация
этот (terraindeform) - локальный, если что.
ответ
Какие-то объекты могут создавать зависимости, осовбожегние хендла не значит, что объект чисто удален. В целом это всё уже из области псевдопрограммирования - не стоит волновться о таких мелочах. Create & Destroy работают достаточно хорошо. И да, объекты это все agent
type agent extends handle all reference counted objects
ответ
Причина: причин было много, а я искал лишь одну
Самыми распространёнными оказались элементарные ошибки в коде, отсутствие параметров, параметры не того типа данных (привет динамическая типизация) или лишние параметры, из за чего происходили "рандомные рассинхроны при обрыве потока"
Огромное спасибо пользователю prog, что откликнулся и смог найти ошибки, а нашёл он их при помощи языкового сервера sumneko lua для VScode

23

» WarCraft 3 / Следовать за юнитом триггерно?

Похожие вопросы:

ответ
Ну только триггерные системы отрядов, была такая...
Вот пример ссылочка
Были и другие, поиск в помощь.
Вот еще ссылка
ответ
А морф обычный не подходит?